package com.itheima.executorservice1;

import java.util.concurrent.*;

public class Test1 {

    public static void main(String[] args) {

        //线程池：ExecutorService接口

        // 创建线程池对象

        //方式一：使用线程池的实现类ThreadPoolExecutor声明7个参数来创建线程池对象
        /*
        各参数的含义：
            1. corePoolSize：核心线程池大小，即线程池中常驻的线程数量，默认情况下，核心线程池中的线程一直处于等待状态，
        当有新的任务进来时，会创建新的线程，直到线程数量达到maximumPoolSize，再有新的任务进来时，
        会使用线程池的饱和策略进行处理，默认情况下，使用AbortPolicy，即抛出异常，阻止系统运行。
            2. maximumPoolSize：最大线程池大小，即线程池中允许创建的最大线程数量，默认情况下，线程池中允许创建的最大线程数量为Integer.MAX_VALUE。
            3. keepAliveTime：线程空闲时间，即当线程池中线程数量大于corePoolSize时，如果空闲时间达到keepAliveTime，则多余的线程会被销毁，直到线程数量为corePoolSize。
            4. unit：keepAliveTime的单位，默认单位为秒。
            5. workQueue：任务队列，即存放任务的队列，默认情况下，使用LinkedBlockingQueue，即有界队列，
            默认容量为Integer.MAX_VALUE，即无界队列。
            6. threadFactory：线程工厂，即创建线程的工厂，默认情况下，使用DefaultThreadFactory，即默认工厂。
            7. handler：饱和策略，即当任务队列已满，且线程池中线程数量达到maximumPoolSize时，
            使用 SaturationPolicy 来进行处理，默认情况下，使用AbortPolicy，即抛出异常，阻止系统运行。

            CallerRunsPolicy：线程池饱和策略，即当线程池中的线程数量达到maximumPoolSize时，
            使用CallerRunsPolicy，即由提交任务的线程来处理任务。（主线程负责调用任务的run()方法从而绕过线程池直接执行）
         */
        ExecutorService pool = new ThreadPoolExecutor(3, 5,
                10, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3),
                Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());

        //2. 使用线程池处理Runnable任务
        Runnable target = new MyRunnable();     //公用
        pool.execute(target);       //提交第一个任务，创建第一个线程，自动启动线程处理这个任务
        pool.execute(target);       //提交第二个任务，创建第二个线程，自动启动线程处理这个任务
        pool.execute(target);       //提交第三个任务，创建第三个线程，自动启动线程处理这个任务
        pool.execute(target);       //复用
        pool.execute(target);       //复用
        pool.execute(target);       //复用
        pool.execute(target);       //到了创建临时线程的时机了
        pool.execute(target);       //到了创建临时线程的时机了
        pool.execute(target);       //忙不过来了，到了饱和策略（任务拒绝）的处理时机了

        //3. 关闭线程池（一般不需要关闭，除非有特殊需求）
        //pool.shutdown();    //等待所有任务执行完毕后再关闭线程池
        //pool.shutdownNow();     //立即关闭线程池，并打断正在执行的任务

    }
}
